package com.xuan.yubi.manager;


import com.xuan.yubi.config.SparkConsoleListener;
import com.xuan.yubi.constant.AiManagerConstants;
import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.exception.SparkException;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class XunFeiAiManager {

    @Autowired
    private SparkClient sparkClient;

    public String doChat(String question) {
        // 消息列表，可以在此列表添加历史对话记录，以获取结合上下文的回答
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(AiManagerConstants.CHART_SYSTEM_CONTENT));
        messages.add(SparkMessage.userContent(question));

        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度,非必传，默认为2048。
                .maxTokens(3072)
                .topK(4)
                // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.5)
                // 指定请求版本，默认使用最新3.0版本
                .apiVersion(SparkApiVersion.V3_5)
                .build();

        SparkSyncChatResponse chatResponse = null;
        try {
            chatResponse = sparkClient.chatSync(sparkRequest);
            return chatResponse.getContent();
        } catch (SparkException e) {
            log.error("AI调用异常", e);
            return "";
        }
    }

    public void chatStream(String question) {
        // 消息列表，可以在此列表添加历史对话记录，以获取结合上下文的回答
        List<SparkMessage> messages = new ArrayList<>();
        messages.add(SparkMessage.systemContent(AiManagerConstants.CHART_SYSTEM_CONTENT));
        messages.add(SparkMessage.userContent(question));

        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度,非必传，默认为2048。
                .maxTokens(4096)
                .topK(4)
                // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.5)
                // 指定请求版本，默认使用最新3.0版本
                .apiVersion(SparkApiVersion.V3_5)
                .build();

        sparkClient.chatStream(sparkRequest, new SparkConsoleListener());

    }


}
